// 2个esp32通过iic连接，发送信息


#include <Arduino.h>

#include "Wire.h"
#include "AsyncTimer.h"



// #define NUM 1

#define ADDR 33
#define BUFF_LEN 32
#define CODE 0
#define LED_PIN 4


#if 0 == CODE

  // 主机程序

  int num = 1;



  void setup() {
    Serial.begin(115200);
    
    // esp32作为iic主机加入
    if(Wire.begin()){
      Serial.printf("iic连接成功");
    }else{
      Serial.printf("iic连接失败");
    }
  }

  void loop() {
    char tmp[BUFF_LEN];
    
    // 将数字转为字符?
    itoa(num++, tmp, 10);
    
    // 从机地址，并开始传送
    Wire.beginTransmission(ADDR);
    Wire.write(tmp);
    
    int ret = Wire.endTransmission();
    if(ret != 0){
      Serial.printf("传送失败： %d\r\n", ret);
      // ?
      return;
    }
    
    delay(100);
    // ?
    int len = Wire.requestFrom(ADDR, BUFF_LEN);
    
    if(len > 0){
      Serial.printf("接收数据大小： %d\r\n", len);
      
      // ?
      Wire.readBytes(tmp, BUFF_LEN);
      Serial.printf("%d\r\n", tmp);
      
      for(int i=0; i<BUFF_LEN; i++){
        Serial.printf("%2x, ", tmp[i]);
        if(i%8 == 7){
          Serial.printf("\r\n");
        }
      }
      Serial.printf("\r\n");
    }
    delay(1900);
  }

  // put function definitions here:
  int myFunction(int x, int y) {
    return x + y;
  }


#elif 1 == CODE
  // 从机代码
  char buf[BUFF_LEN];
  
  AsyncTimer ti;
  
  void on_rcv(int len){
    // 接收数据，将数据存储到buf，让led闪烁
    
    if(len > 0){
      int sz = Wire.readBytes(buf, BUFF_LEN);
      if(sz > 0){
        // 增加信息结尾
        buf[sz] = 0;
        digitalWrite(LED_PIN, HIGH);
        
        // 计数500ms，回调函数是lambda写法
        ti.setTimeout([](){
          digitalWrite(LED_PIN, LOW);
        }, 500);
      }
    }
  }
  
  
  void on_rqst(){
    // 向主机发送数据
    
    // 拼接？
    strcat(buf, " ok");
    
    // 将数据返回主机
    Wire.write(buf);
    // 增加信息结尾
    Wire.write(0);
  }
  
  
  
  void setup() {
    Serial.begin(115200);
    pinMode(LED_PIN, OUTPUT);
    
    // 注册接收事件
    Wire.onReceive(on_rcv);
    // 注册发送事件
    Wire.onRequest(on_rqst);
    
    Wire.begin(33);

  }
  
  
  
  
  void loop() {
    ti.handle();
  }
  


#endif